﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data;

namespace CoVanHocTapData.Infrastructure
{
    public class ExcelController
    {
        //private string _ExcelFile = "";
        //public string ConnectionStringExcel { get { return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + _ExcelFile + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\""; } }
        //private OleDbConnection _con = null;
        //public ExcelController(string excelFileName)
        //{
        //    _ExcelFile = excelFileName;
        //    _con = new OleDbConnection(ConnectionStringExcel);
        //    _con.Open();

        //}
        //public List<string> SheetsName
        //{
        //    get
        //    {
        //        DataTable tb = _con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
        //        List<string> tbName = new List<string>();//"TABLE_NAME"
        //        string stb = "";
        //        for (int i = 0; i < tb.Rows.Count; i++)
        //        {
        //            stb = tb.Rows[i]["TABLE_NAME"].ToString();
        //            if (!stb.EndsWith("_"))
        //                tbName.Add(stb);
        //        }
        //        return tbName;
        //    }
        //}
        //public DataTable this[int SheetIndex]
        //{
        //    get
        //    {
        //        return this[SheetsName[SheetIndex]];
        //    }
        //}
        //public DataTable this[string SheetName]
        //{
        //    get
        //    {
        //        OleDbDataAdapter adap = new OleDbDataAdapter("Select * from [" + SheetName + "]", _con);
        //        DataTable tb = new DataTable();
        //        adap.Fill(tb);
        //        return tb;
        //    }
        //}
        //public void Close()
        //{
        //    try
        //    {
        //        _con.Close();
        //        _con = null;
        //    }
        //    catch { }
        //}
        //public delegate void RowProcessed(int totalRow, int processRow, bool Success);
        ///// <summary>
        ///// Chuỗi phân cách giữa cột excel và cột sql
        ///// </summary>
        //public static string SplitMap { get { return " == "; } }
        ///// <summary>
        ///// Số dòng tối đa khi thêm vào dữ liệu sẽ gọi sự kiện
        ///// </summary>
        //public static int MaxRowCallback = 50;
        ///*
        ///// <summary>
        ///// Đưa dữ liệu từ sheet excel vao các bảng trong sql.
        ///// <br/>
        ///// Các ngoại lệ: Không chọn cột khóa chính cho bảng; 
        ///// </summary>
        ///// <param name="ConnectString">Chuỗi kết nối đến sql</param>
        ///// <param name="TablesImport">Danh sách các bảng sẽ nhận dữ liệu, các bảng này cách nhau bởi dấu phẩy (,). Lưu ý thứ tự của bảng rất quan trọng: bảng nào nằm trước sẽ nhập liệu trước do vậy nên xếp thứ tự bảng theo chiều hướng từ bảng không có khóa ngoại đến các bảng có khóa ngoại</param>
        ///// <param name="RequireTables">Bảng dữ liệu bắt buộc phải có, các bảng cách nhau bởi dấu phẩy (,) nếu bỏ trống xem như không có bảng nào bắt buộc</param>
        ///// <param name="sheet">Sheet dữ liệu của file excel</param>
        ///// <param name="ColumnsMap">Danh sách các cột ánh xạ từ file excel vào sql theo cú pháp: Cột_excel == Cột_SQL</param>
        ///// <param name="type">Kiểu nhập liệu:XoaDuLieuCu:Dữ liệu cũ của các bảng sẽ nhập liệu sẽ bị xóa hết trước khi nhập liệu, CapNhatDuLieuCu: Dữ liệu cũ của các bảng sẽ nhập liệu sẽ được cập nhật mới nếu dữ liệu trong Sheet có khóa trùng với dữ liệu cũ này, BoQuaDuLieuCu: Dữ liệu cũ của các bảng sẽ được nhập liệu sẽ bị bỏ qua nếu dữ liệu nhập có khóa trùng với khóa dữ liệu này (do vậy dữ liệu nhập trùng khóa sẽ bị bỏ qua)</param>
        ///// <param name="rowProcessed">Hàm sự kiện sẽ được gọi khi dữ liệu được nhập 30 dòng</param>
        ///// <returns>Số dòng import thành công</returns>
        //public static void ImportToSQLDB(string ConnectString, string TablesImport,string RequireTables, DataTable Sheet, List<string> ColumnsMap, ImportType type,RowProcessed rowProcessed)
        //{
        
        //    int RowCount = Sheet.Rows.Count;
        //    if (RowCount == 0)
        //        throw new Exception("Không có dữ liệu trong file nguồn.");
        //    List<string> _excelCols = new List<string>(),
        //        _sqlCols = new List<string>(),
        //        _requireTables = new List<string>(RequireTables.Split(','));
        //    for (int i = 0; i < ColumnsMap.Count; i++)
        //    {
        //        string[] _twoCols = ColumnsMap[i].Split(new string[] { SplitMap }, StringSplitOptions.RemoveEmptyEntries);
        //        if (_twoCols.Length != 2)
        //            continue;
        //        _excelCols.Add(_twoCols[0]);
        //        _sqlCols.Add(_twoCols[1]);
        //    }
        //    //các bước xử lý:
        //    //xét khóa của các bảng nếu bảng đó có nhập liệu
        //    //thong tin luu: tên bảng và danh sách cột xử lý của bảng tương ứng
        //    Dictionary<string, List<DataColumn>> _TableInfo = new Dictionary<string, List<DataColumn>>();
        //    //Lưu tên bảng và câu điều kiện sau where của bảng tuong ứng
        //    Dictionary<string, string> _TableUpdate = new Dictionary<string, string>();
        //    string []Tables = TablesImport.Split(',');
        //    //kiểm tra các bảng và xét 
        //    for (int t = 0; t < Tables.Length; t++)
        //    {
        //        //lấy ra tất cả các cột có ánh xạ dữ liệu
        //        List<DataColumn> _cols = DataBaseController.Columns(Tables[t]);
        //        for (int i = 0; i < _cols.Count; )
        //        {
        //            //nếu cột không nằm trong ánh xạ hoặc là cột tự tăng hoặc readonly thì bỏ ra 
        //            if (!_sqlCols.Contains(_cols[i].ColumnName) || _cols[i].AutoIncrement || _cols[i].ReadOnly)
        //                _cols.RemoveAt(i);
        //            else i++;
        //        }
        //        //nếu không có cột nào thì bỏ qua bảng đó, chổ này sẽ xét bảng bắt buộc hay không
        //        if (_cols.Count == 0)
        //        {
        //            if (_requireTables.Contains(Tables[t]))
        //                throw new Exception(string.Format("Chưa chọn cột ánh xạ cho dữ liệu: [{0}]", Tables[t]));
        //            continue;
        //        }
        //        List<DataColumn> _primaryCol = DataBaseController.ColumnsKey(Tables[t]);
        //        //kiểm tra khóa chính, nếu khóa chính không là tự tăng hay readonly thì buộc phải có khóa chính, nếu không có thì báo lỗi


        //        if (_primaryCol.Count > 0)
        //        {
        //            List<string> _colsName = DataBaseController.ToListString(_cols);
        //            string _error = "", 
        //                where = "", //chứa các cột khóa chính để tạo điều kiện where sau này
        //                update = "";//câu lệnh update du lieu cũ theo du lieu dang import
        //            for (int i = 0; i < _primaryCol.Count; i++)
        //            {
        //                //nếu khóa chính không phải tự tăng và không readonly mà không có trong ánh xạ thì cộng vô lỗi
        //                if (!_primaryCol[i].AutoIncrement && !_primaryCol[i].ReadOnly && !_colsName.Contains(_primaryCol[i].ColumnName))
        //                    _error += ", " + _primaryCol[i].ColumnName;
        //                if (_colsName.Contains(_primaryCol[i].ColumnName))
        //                    where += "," + _primaryCol[i].ColumnName;
        //                //nếu là tự tăng hoặc chỉ đọc mà có trong danh sách chèn dữ liệu thì loại bỏ ra
        //                if ((_primaryCol[i].AutoIncrement || _primaryCol[i].ReadOnly) && _colsName.Contains(_primaryCol[i].ColumnName))
        //                {
        //                    _cols.RemoveAt(_colsName.IndexOf(_primaryCol[i].ColumnName));
        //                    _colsName.Remove(_primaryCol[i].ColumnName);
        //                }
        //                //else //ngược lại thì phát sinh điều kiện where cho khóa chính
        //                //    where += " AND " + _primaryCol[i].ColumnName + "=@" + _primaryCol[i].ColumnName;
        //            }
        //            if (_error != "")
        //                throw new Exception("Thiếu thông tin bắt buộc bắt buộc: " + _error.Substring(2) + " cho dữ liệu " + Tables[t]);
        //            //bỏ đi lệnh AND đầu của where
        //            if (where != "")
        //                where = where.Substring(1);
        //            //phát sinh lệnh update các cột đã bỏ đi khóa chính
        //            List<string> _primaryName = DataBaseController.ToListString(_primaryCol);
        //            foreach (string s in _colsName)
        //                if (!_primaryName.Contains(s))//nếu không là khóa chính
        //                    update += "," + s;
        //            //bỏ đi dấu , đầu tiên
        //            if (update != "")
        //                update = update.Substring(1);
        //            _TableUpdate.Add(Tables[t], update + "|" + where);
        //        }
        //        _TableInfo.Add(Tables[t], _cols);
        //    }
        //    string _lineError = "",
        //        _lineInserted = "";
        //    int _totalLineInserted = 0, _rowProcessed = 0;
        //    SqlConnection _Connect = new SqlConnection(ConnectString);
        //    _Connect.Open();
        //    if (type == ImportType.XoaDuLieuCu)
        //        for (int t = Tables.Length-1; t >=0 ; t--)//xóa dữ liệu theo chiều ngược lại
        //            if(_TableInfo.ContainsKey(Tables[t]))
        //        {
        //            SqlCommand _delCmd = new SqlCommand("delete from " + Tables[t], _Connect);
        //            _delCmd.ExecuteNonQuery();
        //        }
        //    foreach (string tb in _TableInfo.Keys)
        //    {
        //        //phát sinh câu insert cho bảng
        //        List<DataColumn> _cols = _TableInfo[tb];
        //        int _inserted = 0;
        //        string _colsInsert = _cols[0].ColumnName;
        //        string _paramsInsert = "@" + _cols[0].ColumnName;
        //        for (int c = 1; c < _cols.Count; c++)
        //        {
        //            _colsInsert += "," + _cols[c].ColumnName;
        //            _paramsInsert += ",@" + _cols[c].ColumnName;
        //        }
        //        string _insert = string.Format("insert into {0}({1}) values({2})", tb, _colsInsert, _paramsInsert);
        //        string _update = "";//chứa lệnh update
        //        string _select = "";//chứa lệnh select *
        //        string[] _whereCols = null, _updateCols = null;
        //         if(type!= ImportType.XoaDuLieuCu && _TableUpdate.ContainsKey(tb))
        //        {
        //            string[] _upwhere = _TableUpdate[tb].Split('|');
        //            _whereCols = _upwhere[1].Split(',');
        //            _updateCols = _upwhere[0].Split(',');
        //            string _where = _whereCols[0] + "=@" + _whereCols[0];
        //            for (int i = 1; i < _whereCols.Length; i++)
        //                _where += " AND " + _whereCols[i] + "=@" + _whereCols[i];
        //            _update = _updateCols[0]+ "=@" + _updateCols[0];
        //            for (int i = 1; i < _updateCols.Length; i++)
        //                _update += "," + _updateCols[i] + "=@" + _updateCols[i];
        //            _update = string.Format("update {0} set {1} where {2}", tb, _update, _where);
        //            _select = string.Format("select count(*) from {0} where {1}", tb, _where);
        //        }
        //        DataTable _data = new DataTable();
        //        List<string> _oldLine = new List<string>();
        //        //kiểm tra từng dòng trong dữ liệu
        //        for(int r=0;r<Sheet.Rows.Count;r++)
        //        {
        //            DataRow row = Sheet.Rows[r];
        //            string line = "";
        //            bool _success = false;
        //            bool _exist = false;
        //            //thêm dòng dang xét vào dữ liệu
        //            SqlCommand _cmd = null;
        //            SqlParameter param = null;
        //            _rowProcessed++;
        //            _cmd = new SqlCommand(_insert, _Connect);

        //            for (int ci = 0; ci < _cols.Count; ci++)
        //            {
        //                DataColumn c = _cols[ci];
        //                param = new SqlParameter("@" + c.ColumnName, row[_excelCols[_sqlCols.IndexOf(c.ColumnName)]]);
        //                _cmd.Parameters.Add(param);
        //                line += row[_excelCols[_sqlCols.IndexOf(c.ColumnName)]].ToString() + ",";
        //            }
        //            line = line.Trim(',');
        //            if (line =="" || _oldLine.Contains(line))
        //                continue;
        //            else
        //                _oldLine.Add(line);
        //            if (type != ImportType.XoaDuLieuCu && _update!="")//kiểm tra xem dữ liệu cũ có không
        //            {
        //                SqlCommand _cmdTest = new SqlCommand(_select, _Connect);
        //                for (int uuu = 0; uuu < _whereCols.Length; uuu++)
        //                {
        //                    string _w = _whereCols[uuu];
        //                    param = new SqlParameter("@" + _w, row[_excelCols[_sqlCols.IndexOf(_w)]]);
        //                    _cmdTest.Parameters.Add(param);
        //                }
        //                object o = _cmdTest.ExecuteScalar();
        //                int v;
        //                if (o != null && int.TryParse(o.ToString(), out v) && v > 0)
        //                    _exist = true;
        //            }
        //            if (_exist) //nếu đã có thì xử lý update hoac bỏ qua
        //            {
        //                if (type == ImportType.CapNhatDuLieuCu)
        //                {
        //                    SqlCommand _cmdTest = new SqlCommand(_update, _Connect);
        //                    //thêm dữ liệu cập nhật
        //                    for(int uuu=0;uuu< _updateCols.Length;uuu++)
        //                    {
        //                        string _w = _updateCols[uuu];
        //                        param = new SqlParameter("@" + _w, row[_excelCols[_sqlCols.IndexOf(_w)]]);
        //                        _cmdTest.Parameters.Add(param);
        //                    }
        //                    //thêm dữ liệu điều kiện
        //                    for (int uuu = 0; uuu < _whereCols.Length; uuu++)
        //                    {
        //                        string _w = _whereCols[uuu];
        //                        param = new SqlParameter("@" + _w, row[_excelCols[_sqlCols.IndexOf(_w)]]);
        //                        _cmdTest.Parameters.Add(param);
        //                    }
        //                    _cmdTest.ExecuteNonQuery(); 
        //                    _success = true;
        //                }
        //            }
        //            else
        //            {
        //                try
        //                {
        //                    if (_cmd.ExecuteNonQuery() == 0)
        //                        throw new Exception("Không thêm được");
        //                    _inserted++;
        //                    _totalLineInserted++;
        //                    _success = true;
        //                }
        //                catch (Exception)
        //                {
        //                    _lineError += string.Format("<br/>Dữ liệu <b>{0}</b> lỗi: {1}", tb, line);
        //                }
        //            }

        //            if (rowProcessed != null && _rowProcessed % MaxRowCallback == 0)
        //                rowProcessed(Sheet.Rows.Count * _TableInfo.Count, _rowProcessed, _success);
        //        }
        //        _lineInserted += string.Format("<br/>Đã thêm {0} dòng vào {1}", _inserted.ToString("#,#0"), tb);
        //    }
        //    _Connect.Close();
        //    rowProcessed(Sheet.Rows.Count * _TableInfo.Count, _rowProcessed, true);
        //    _lineInserted = string.Format("Đã xử lý {1} dòng. Có {0} dòng dữ liệu đã thêm vào các bảng. ", _totalLineInserted.ToString("#,#0"), _rowProcessed.ToString("#,#0"));
        //    if (_lineError != "")
        //        _lineError = "Các thông tin lỗi:" + _lineError;
        //    throw new InformationException(_lineError, _lineInserted);
        //}
        // */
        //private static bool IsStringCol(Type tp)
        //{
        //    if (tp.ToString().Contains("DateTime") || tp.ToString().Contains("TimeSpan"))
        //        return true;
        //    string t = tp.ToString();
        //    int p = t.LastIndexOf('.');
        //    if (p != -1)
        //        t = t.Substring(p + 1);
        //    if (t != "")
        //        t = char.ToLower(t[0]) + t.Substring(1);
        //    if (t.Contains("string"))
        //        return true;
        //    return false;
        //}

        ///// <summary>
        ///// Thêm tham số cho _cmd
        ///// TableSQL: bảng sql để kiểm tra xem cột có cho phép null không
        ///// </summary>
        ///// <param name="_cmd"></param>
        ///// <param name="_cols"></param>
        ///// <param name="_Maping"></param>
        ///// <param name="ParamValue"></param>
        ///// <param name="row"></param>
        ///// <param name="TableSQL"></param>
        ///// <returns></returns>
        //private static string AddParamValue(ref SqlCommand _cmd, string[] _cols,
        //    //List<string> _excelCols, List<string> _sqlCols, 
        //    Dictionary<string, string> _Maping,
        //    Dictionary<string, string> ParamValue, DataRow row, string TableSQL)
        //{
        //    string line = "";
        //    List<DataColumn> Colums = DataBaseController.Columns(TableSQL);
        //    for (int ci = 0; ci < _cols.Length; ci++)
        //    {
        //        string c = _cols[ci];
        //        SqlParameter param = null;
        //        //int p= _sqlCols.IndexOf(c);
        //        //if (p >= 0)
        //        object val = null;
        //        if (_Maping.ContainsKey(c))
        //            val = row[_Maping[c]];
        //        else if (ParamValue.ContainsKey(c))
        //            val = ParamValue[c];
        //        if (val != null && val.ToString() == "" || val == null)
        //            val = DBNull.Value;
        //        DataColumn col = null;
        //        for (int i = 0; i < Colums.Count; i++)
        //            if (Colums[i].ColumnName.ToLower() == c.ToLower())
        //            {
        //                col = Colums[i];
        //                break;
        //            }
        //        if (val == DBNull.Value && !col.AllowDBNull)
        //        //nếu là null và cột không cho null
        //        {
        //            if (IsStringCol(col.DataType))
        //                val = "";
        //            else val = "0";
        //        }
        //        param = new SqlParameter("@" + c, val); //row[_excelCols[p]]);
        //        line += (val == DBNull.Value ? "null" : val.ToString()) + ","; //row[_excelCols[p]].ToString() + ",";
        //        _cmd.Parameters.Add(param);
        //    }
        //    return line;
        //}
        //private static IController[] _Controls = new IController[] { new SinhVienController(), new NhomController() };
        //private static IController FindController(string _TableName)
        //{
        //    for (int i = 0; i < _Controls.Length; i++)
        //        if (_Controls[i].CheckTableValid(_TableName))
        //            return _Controls[i];
        //    return null;
        //}
        //public static void ImportToSQLDB(string ConnectString, string TablesImport, string RequireTables, DataTable Sheet, List<string> ColumnsMap, ImportType type, RowProcessed rowProcessed)
        //{
        //    ImportToSQLDB(ConnectString, TablesImport, RequireTables, Sheet, ColumnsMap, type, null, rowProcessed);
        //}

        //public static void ImportToSQLDB(string ConnectString, string TablesImport, string RequireTables, DataTable Sheet, List<string> ColumnsMap, ImportType type)
        //{
        //    ImportToSQLDB_SinhHoat(ConnectString, TablesImport, RequireTables, Sheet, ColumnsMap, type, null);
        //}

        ///// <summary>
        ///// Đưa dữ liệu từ sheet excel vao các bảng trong sql.
        ///// <br/>
        ///// Các ngoại lệ: Không chọn cột khóa chính cho bảng; 
        ///// </summary>
        ///// <param name="ConnectString">Chuỗi kết nối đến sql</param>
        ///// <param name="TablesImport">Danh sách các bảng sẽ nhận dữ liệu, các bảng này cách nhau bởi dấu phẩy (,). Lưu ý thứ tự của bảng rất quan trọng: bảng nào nằm trước sẽ nhập liệu trước do vậy nên xếp thứ tự bảng theo chiều hướng từ bảng không có khóa ngoại đến các bảng có khóa ngoại</param>
        ///// <param name="RequireTables">Bảng dữ liệu bắt buộc phải có, các bảng cách nhau bởi dấu phẩy (,) nếu bỏ trống xem như không có bảng nào bắt buộc</param>
        ///// <param name="sheet">Sheet dữ liệu của file excel</param>
        ///// <param name="ColumnsMap">Danh sách các cột ánh xạ từ file excel vào sql theo cú pháp: Cột_excel == Cột_SQL</param>
        ///// <param name="type">Kiểu nhập liệu:XoaDuLieuCu:Dữ liệu cũ của các bảng sẽ nhập liệu sẽ bị xóa hết trước khi nhập liệu, CapNhatDuLieuCu: Dữ liệu cũ của các bảng sẽ nhập liệu sẽ được cập nhật mới nếu dữ liệu trong Sheet có khóa trùng với dữ liệu cũ này, BoQuaDuLieuCu: Dữ liệu cũ của các bảng sẽ được nhập liệu sẽ bị bỏ qua nếu dữ liệu nhập có khóa trùng với khóa dữ liệu này (do vậy dữ liệu nhập trùng khóa sẽ bị bỏ qua)</param>
        ///// <param name="Param">Truyền vào khi thực hiện nhập liệu, theo qui tắc: Tên tham số là key(cột trong du lieu), và giá trị của key là giá trị dữ liệu sẽ thêm, có thể là null nếu không có param</param>
        ///// <param name="rowProcessed">Hàm sự kiện sẽ được gọi khi dữ liệu được nhập 30 dòng</param>
        ///// <returns>Số dòng import thành công</returns>
        //public static void ImportToSQLDB(string ConnectString, string TablesImport, string RequireTables, DataTable Sheet, List<string> ColumnsMap, ImportType type, Dictionary<string, string> ParamValue, RowProcessed rowProcessed)
        //{
        //    if (ParamValue == null) ParamValue = new Dictionary<string, string>();
        //    int RowCount = Sheet.Rows.Count;
        //    if (RowCount == 0) throw new Exception("Không có dữ liệu trong file nguồn.");

        //    List<string> //_excelCols = new List<string>(),
        //        //_sqlCols = new List<string>(),
        //        _requireTables = new List<string>(RequireTables.Split(','));
        //    //chứa ánh xạ từ cột SQL sang cột trong excel
        //    Dictionary<string, string> _Maping = new Dictionary<string, string>();
        //    for (int i = 0; i < ColumnsMap.Count; i++)
        //    {
        //        string[] _twoCols = ColumnsMap[i].Split(new string[] { SplitMap }, StringSplitOptions.RemoveEmptyEntries);
        //        if (_twoCols.Length != 2)
        //            continue;
        //        //_excelCols.Add(_twoCols[0]);
        //        //_sqlCols.Add(_twoCols[1]);
        //        _Maping.Add(_twoCols[1], _twoCols[0]);
        //    }

        //    //hoc ky
        //    _Maping.Add("HocKyID", "f_HocKyID");

        //    //các bước xử lý:
        //    //xét khóa của các bảng nếu bảng đó có nhập liệu
        //    //thong tin luu: tên bảng và danh sách cột xử lý của bảng tương ứng
        //    Dictionary<string, List<DataColumn>> _TableInfo = new Dictionary<string, List<DataColumn>>();
        //    //Lưu tên bảng và câu điều kiện sau where của bảng tuong ứng
        //    Dictionary<string, string> _TableUpdate = new Dictionary<string, string>();
        //    string[] Tables = TablesImport.Split(',');
        //    //kiểm tra các bảng và xét 
        //    for (int t = 0; t < Tables.Length; t++)
        //    {
        //        //lấy ra tất cả các cột có ánh xạ dữ liệu
        //        List<DataColumn> _cols = DataBaseController.Columns(Tables[t]);
        //        for (int i = 0; i < _cols.Count; )
        //        {
        //            //nếu cột không nằm trong ánh xạ và không nằm trong tham số hoặc là cột tự tăng hoặc readonly thì bỏ ra 
        //            if ((!_Maping.ContainsKey(_cols[i].ColumnName) && //!_sqlCols.Contains(_cols[i].ColumnName) && 
        //                !ParamValue.ContainsKey(_cols[i].ColumnName)) || _cols[i].AutoIncrement || _cols[i].ReadOnly)
        //                _cols.RemoveAt(i);
        //            else i++;
        //        }
        //        //nếu không có cột nào thì bỏ qua bảng đó, chổ này sẽ xét bảng bắt buộc hay không
        //        if (_cols.Count == 0)
        //        {
        //            if (_requireTables.Contains(Tables[t]))
        //                throw new Exception(string.Format("Chưa chọn cột ánh xạ cho dữ liệu: [{0}]", Tables[t]));
        //            continue;
        //        }
        //        List<DataColumn> _primaryCol = DataBaseController.ColumnsKey(Tables[t]);
        //        //kiểm tra khóa chính, nếu khóa chính không là tự tăng hay readonly thì buộc phải có khóa chính, nếu không có thì báo lỗi


        //        if (_primaryCol.Count > 0)
        //        {
        //            List<string> _colsName = DataBaseController.ToListString(_cols);
        //            string _error = "",
        //                where = "", //chứa các cột khóa chính để tạo điều kiện where sau này
        //                update = "";//câu lệnh update du lieu cũ theo du lieu dang import
        //            for (int i = 0; i < _primaryCol.Count; i++)
        //            {
        //                //nếu khóa chính không phải tự tăng và không readonly mà không có trong ánh xạ thì cộng vô lỗi
        //                if (!_primaryCol[i].AutoIncrement && !_primaryCol[i].ReadOnly && !_colsName.Contains(_primaryCol[i].ColumnName))
        //                    _error += ", " + _primaryCol[i].ColumnName;
        //                if (_colsName.Contains(_primaryCol[i].ColumnName))
        //                    where += "," + _primaryCol[i].ColumnName;
        //                //nếu là tự tăng hoặc chỉ đọc mà có trong danh sách chèn dữ liệu thì loại bỏ ra
        //                if ((_primaryCol[i].AutoIncrement || _primaryCol[i].ReadOnly) && _colsName.Contains(_primaryCol[i].ColumnName))
        //                {
        //                    _cols.RemoveAt(_colsName.IndexOf(_primaryCol[i].ColumnName));
        //                    _colsName.Remove(_primaryCol[i].ColumnName);
        //                }
        //                //else //ngược lại thì phát sinh điều kiện where cho khóa chính
        //                //    where += " AND " + _primaryCol[i].ColumnName + "=@" + _primaryCol[i].ColumnName;
        //            }
        //            if (_error != "")
        //                throw new Exception("Thiếu thông tin bắt buộc bắt buộc: " + _error.Substring(2) + " cho dữ liệu " + Tables[t]);
        //            //bỏ đi lệnh AND đầu của where
        //            if (where != "")
        //                where = where.Substring(1);
        //            //phát sinh lệnh update các cột đã bỏ đi khóa chính
        //            List<string> _primaryName = DataBaseController.ToListString(_primaryCol);
        //            foreach (string s in _colsName)
        //                if (!_primaryName.Contains(s))//nếu không là khóa chính
        //                    update += "," + s;
        //            //bỏ đi dấu , đầu tiên
        //            if (update != "")
        //                update = update.Substring(1);
        //            _TableUpdate.Add(Tables[t], update + "|" + where);
        //        }
        //        _TableInfo.Add(Tables[t], _cols);
        //    }
        //    string _lineError = "",
        //        _lineInserted = "";
        //    int _totalLineInserted = 0, _rowProcessed = 0, _rowUpdated = 0, _rowError = 0;
        //    SqlConnection _Connect = new SqlConnection(ConnectString);
        //    _Connect.Open();

        //    ImportType tmpType = type;
        //    foreach (string tb in _TableInfo.Keys)
        //    {
        //        type = tmpType;//lấy lại loại ban đầu (có thể thay đổi khi xử lý bảng trước)
        //        //phát sinh câu insert cho bảng
        //        List<DataColumn> _cols = _TableInfo[tb];
        //        //int _inserted = 0;
        //        string _colsInsert = _cols[0].ColumnName;
        //        string _paramsInsert = "@" + _cols[0].ColumnName;

        //        string _update = "";//chứa lệnh update
        //        string _select = "";//chứa lệnh select *
        //        string[] _whereCols = null, _updateCols = null;
        //        //----Tìm controller xử lý tương ứng---------
        //        IController _Control = FindController(tb);
        //        if (_Control == null)//nếu không có controller xử lý thì tự hàm xử lý
        //        {
        //            for (int c = 1; c < _cols.Count; c++)
        //            {
        //                _colsInsert += "," + _cols[c].ColumnName;
        //                _paramsInsert += ",@" + _cols[c].ColumnName;
        //            }
        //            if (type != ImportType.XoaDuLieuCu && _TableUpdate.ContainsKey(tb))
        //            {
        //                string[] _upwhere = _TableUpdate[tb].Split('|');
        //                _whereCols = _upwhere[1].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
        //                _updateCols = _upwhere[0].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

        //                string _where = "";
        //                if (_whereCols.Length > 0)
        //                {
        //                    _where = _whereCols[0] + "=@" + _whereCols[0];
        //                    for (int i = 1; i < _whereCols.Length; i++)
        //                        _where += " AND " + _whereCols[i] + "=@" + _whereCols[i];
        //                }
        //                if (_updateCols.Length > 0)
        //                {
        //                    _update = _updateCols[0] + "=@" + _updateCols[0];
        //                    for (int i = 1; i < _updateCols.Length; i++)
        //                        _update += "," + _updateCols[i] + "=@" + _updateCols[i];
        //                }
        //                if (_where != "" && _update != "")
        //                    _update = string.Format("update {0} set {1} where {2}", tb, _update, _where);
        //                else
        //                    _update = "";
        //                if (_where != "")
        //                    _select = string.Format("select count(*) from {0} where {1}", tb, _where);
        //            }
        //            //chuyển phần xóa từ trên xuống ...........
        //            else
        //            {
        //                try
        //                {
        //                    SqlCommand _delCmd = new SqlCommand("delete from " + tb, _Connect);
        //                    _delCmd.ExecuteNonQuery();
        //                }
        //                catch
        //                {
        //                    _lineError += string.Format("<br/>Không xóa được dữ liệu <b>{0}</b>, dữ liệu còn lại sẽ được cập nhật mới", tb);
        //                }
        //                type = ImportType.CapNhatDuLieuCu;
        //            }
        //        }
        //        else
        //            _Control.BeforeProcess(_Connect, type);
        //        string _insert = string.Format("insert into {0}({1}) values({2})", tb, _colsInsert, _paramsInsert);
        //        DataTable _data = new DataTable();
        //        List<string> _oldLine = new List<string>();
        //        //kiểm tra từng dòng trong dữ liệu
        //        for (int r = 0; r < Sheet.Rows.Count; r++)
        //        {
        //            DataRow row = Sheet.Rows[r];
        //            //thêm dòng dang xét vào dữ liệu
        //            SqlCommand _cmd = null;
        //            _rowProcessed++;
        //            string line = "";
        //            bool _success = false;
        //            bool _exist = false;
        //            if (_Control != null)
        //            {
        //                try
        //                {
        //                    int kkk = _Control.Process(row, _Maping, ParamValue, type, _Connect);
        //                    if (kkk == 1)
        //                        _totalLineInserted++;
        //                    else if (kkk == 2)
        //                        _rowUpdated++;
        //                    if (kkk > 0)
        //                        _success = true;
        //                    if (rowProcessed != null && _rowProcessed % MaxRowCallback == 0)
        //                        rowProcessed(Sheet.Rows.Count * _TableInfo.Count, _rowProcessed, _success);
        //                }
        //                catch (Exception exx)
        //                {
        //                    _lineError += string.Format("<br/>Dữ liệu <b>{0}</b> dòng {2} lỗi: {1}", tb, exx.Message.Replace("'", "`").Replace("\r", "").Replace("\n", "<br/>"), (r + 2).ToString("#,#0"));
        //                    _rowError++;
        //                }
        //                continue;
        //            }


        //            _cmd = new SqlCommand(_insert, _Connect);
        //            line = AddParamValue(ref  _cmd, DataBaseController.ToListString(_cols).ToArray(),
        //                _Maping,//_excelCols, _sqlCols,
        //                ParamValue, row, tb);

        //            line = line.Trim(',');
        //            if (line == "" || _oldLine.Contains(line))
        //                continue;
        //            else
        //                _oldLine.Add(line);
        //            if (type != ImportType.XoaDuLieuCu && _select != "")//kiểm tra xem dữ liệu cũ có không
        //            {
        //                SqlCommand _cmdTest = new SqlCommand(_select, _Connect);

        //                AddParamValue(ref  _cmdTest, _whereCols,
        //                    _Maping,//_excelCols, _sqlCols, 
        //                    ParamValue, row, tb);
        //                try
        //                {
        //                    object o = _cmdTest.ExecuteScalar();
        //                    int v;
        //                    if (o != null && int.TryParse(o.ToString(), out v) && v > 0)
        //                        _exist = true;
        //                }
        //                catch (Exception exx)
        //                {
        //                    _exist = false;
        //                    _lineError += string.Format("<br/>Dữ liệu <b>{0}({1})</b> dòng {3} lỗi truy vấn thông tin: {2}", tb, line, exx.Message.Replace("'", "`").Replace("\r", "").Replace("\n", "<br/>"), (r + 2).ToString("#,#0"));
        //                }
        //            }
        //            if (_exist) //nếu đã có thì xử lý update hoac bỏ qua
        //            {
        //                if (type == ImportType.CapNhatDuLieuCu && _update != "")
        //                {
        //                    SqlCommand _cmdTest = new SqlCommand(_update, _Connect);
        //                    //thêm dữ liệu cập nhật
        //                    AddParamValue(ref  _cmdTest, _updateCols,
        //                        _Maping,//_excelCols, _sqlCols, 
        //                        ParamValue, row, tb);
        //                    //thêm dữ liệu điều kiện
        //                    AddParamValue(ref  _cmdTest, _whereCols,
        //                        _Maping,//_excelCols, _sqlCols, 
        //                        ParamValue, row, tb);
        //                    try
        //                    {
        //                        _cmdTest.ExecuteNonQuery();
        //                        _rowUpdated++;
        //                        _success = true;
        //                    }
        //                    catch (Exception exx)
        //                    {
        //                        _lineError += string.Format("<br/>Dữ liệu <b>{0}({1})</b> dòng {3} lỗi: {2}", tb, line, exx.Message.Replace("'", "`").Replace("\r", "").Replace("\n", "<br/>"), (r + 2).ToString("#,#0"));
        //                        _rowError++;
        //                    }
        //                }
        //            }
        //            else
        //            {
        //                try
        //                {
        //                    if (_cmd.ExecuteNonQuery() == 0)
        //                        throw new Exception("Không thêm được");
        //                    //_inserted++;
        //                    _totalLineInserted++;
        //                    _success = true;
        //                }
        //                catch (Exception exx)
        //                {
        //                    _lineError += string.Format("<br/>Dữ liệu <b>{0}({1})</b> dòng {3} lỗi: {2}", tb, line, exx.Message.Replace("'", "`").Replace("\r", "").Replace("\n", "<br/>"), (r + 2).ToString("#,#0"));
        //                    _rowError++;
        //                }
        //            }

        //            if (rowProcessed != null && _rowProcessed % MaxRowCallback == 0)
        //                rowProcessed(Sheet.Rows.Count * _TableInfo.Count, _rowProcessed, _success);
        //        }
        //        //_lineInserted += string.Format("<br/>Đã thêm {0} dòng vào {1}", _inserted.ToString("#,#0"), tb);
        //    }
        //    _Connect.Close();
        //    rowProcessed(Sheet.Rows.Count * _TableInfo.Count, _rowProcessed, true);
        //    _lineInserted = string.Format("Đã xử lý {1} dòng. Có {0} dòng dữ liệu đã thêm mới và {2} dòng cập nhật. ", _totalLineInserted.ToString("#,#0"), _rowProcessed.ToString("#,#0"), _rowUpdated.ToString("#,#0"));
        //    if (_lineError != "")
        //        _lineError = string.Format("Có {0} dòng lỗi. Các thông tin lỗi: {1}", _rowError.ToString("#,#0"), _lineError);
        //    throw new InformationException(_lineError, _lineInserted);
        //}

        ///// <summary>
        ///// Đưa dữ liệu từ sheet excel vao các bảng trong sql.
        ///// <br/>
        ///// Các ngoại lệ: Không chọn cột khóa chính cho bảng; 
        ///// </summary>
        ///// <param name="ConnectString">Chuỗi kết nối đến sql</param>
        ///// <param name="TablesImport">Danh sách các bảng sẽ nhận dữ liệu, các bảng này cách nhau bởi dấu phẩy (,). Lưu ý thứ tự của bảng rất quan trọng: bảng nào nằm trước sẽ nhập liệu trước do vậy nên xếp thứ tự bảng theo chiều hướng từ bảng không có khóa ngoại đến các bảng có khóa ngoại</param>
        ///// <param name="RequireTables">Bảng dữ liệu bắt buộc phải có, các bảng cách nhau bởi dấu phẩy (,) nếu bỏ trống xem như không có bảng nào bắt buộc</param>
        ///// <param name="sheet">Sheet dữ liệu của file excel</param>
        ///// <param name="ColumnsMap">Danh sách các cột ánh xạ từ file excel vào sql theo cú pháp: Cột_excel == Cột_SQL</param>
        ///// <param name="type">Kiểu nhập liệu:XoaDuLieuCu:Dữ liệu cũ của các bảng sẽ nhập liệu sẽ bị xóa hết trước khi nhập liệu, CapNhatDuLieuCu: Dữ liệu cũ của các bảng sẽ nhập liệu sẽ được cập nhật mới nếu dữ liệu trong Sheet có khóa trùng với dữ liệu cũ này, BoQuaDuLieuCu: Dữ liệu cũ của các bảng sẽ được nhập liệu sẽ bị bỏ qua nếu dữ liệu nhập có khóa trùng với khóa dữ liệu này (do vậy dữ liệu nhập trùng khóa sẽ bị bỏ qua)</param>
        ///// <param name="Param">Truyền vào khi thực hiện nhập liệu, theo qui tắc: Tên tham số là key(cột trong du lieu), và giá trị của key là giá trị dữ liệu sẽ thêm, có thể là null nếu không có param</param>
        ///// <returns>Số dòng import thành công</returns>
        //public static void ImportToSQLDB_SinhHoat(string ConnectString, string TablesImport, string RequireTables, DataTable Sheet, List<string> ColumnsMap, ImportType type, Dictionary<string, string> ParamValue)
        //{
        //    if (ParamValue == null) ParamValue = new Dictionary<string, string>();
        //    int RowCount = Sheet.Rows.Count;
        //    if (RowCount == 0) throw new Exception("Không có dữ liệu trong file nguồn.");

        //    List<string> //_excelCols = new List<string>(),
        //        //_sqlCols = new List<string>(),
        //        _requireTables = new List<string>(RequireTables.Split(','));
        //    //chứa ánh xạ từ cột SQL sang cột trong excel
        //    Dictionary<string, string> _Maping = new Dictionary<string, string>();
        //    for (int i = 0; i < ColumnsMap.Count; i++)
        //    {
        //        string[] _twoCols = ColumnsMap[i].Split(new string[] { SplitMap }, StringSplitOptions.RemoveEmptyEntries);
        //        if (_twoCols.Length != 2)
        //            continue;
        //        //_excelCols.Add(_twoCols[0]);
        //        //_sqlCols.Add(_twoCols[1]);
        //        _Maping.Add(_twoCols[1], _twoCols[0]);
        //    }
        //    //các bước xử lý:
        //    //xét khóa của các bảng nếu bảng đó có nhập liệu
        //    //thong tin luu: tên bảng và danh sách cột xử lý của bảng tương ứng
        //    Dictionary<string, List<DataColumn>> _TableInfo = new Dictionary<string, List<DataColumn>>();
        //    //Lưu tên bảng và câu điều kiện sau where của bảng tuong ứng
        //    Dictionary<string, string> _TableUpdate = new Dictionary<string, string>();
        //    string[] Tables = TablesImport.Split(',');
        //    //kiểm tra các bảng và xét 
        //    for (int t = 0; t < Tables.Length; t++)
        //    {
        //        //lấy ra tất cả các cột có ánh xạ dữ liệu
        //        List<DataColumn> _cols = DataBaseController.Columns(Tables[t]);
        //        for (int i = 0; i < _cols.Count; )
        //        {
        //            //nếu cột không nằm trong ánh xạ và không nằm trong tham số hoặc là cột tự tăng hoặc readonly thì bỏ ra 
        //            if ((!_Maping.ContainsKey(_cols[i].ColumnName) && //!_sqlCols.Contains(_cols[i].ColumnName) && 
        //                !ParamValue.ContainsKey(_cols[i].ColumnName)) || _cols[i].AutoIncrement || _cols[i].ReadOnly)
        //                _cols.RemoveAt(i);
        //            else i++;
        //        }
        //        //nếu không có cột nào thì bỏ qua bảng đó, chổ này sẽ xét bảng bắt buộc hay không
        //        if (_cols.Count == 0)
        //        {
        //            if (_requireTables.Contains(Tables[t]))
        //                throw new Exception(string.Format("Chưa chọn cột ánh xạ cho dữ liệu: [{0}]", Tables[t]));
        //            continue;
        //        }
        //        List<DataColumn> _primaryCol = DataBaseController.ColumnsKey(Tables[t]);
        //        //kiểm tra khóa chính, nếu khóa chính không là tự tăng hay readonly thì buộc phải có khóa chính, nếu không có thì báo lỗi


        //        if (_primaryCol.Count > 0)
        //        {
        //            List<string> _colsName = DataBaseController.ToListString(_cols);
        //            string _error = "",
        //                where = "", //chứa các cột khóa chính để tạo điều kiện where sau này
        //                update = "";//câu lệnh update du lieu cũ theo du lieu dang import
        //            for (int i = 0; i < _primaryCol.Count; i++)
        //            {
        //                //nếu khóa chính không phải tự tăng và không readonly mà không có trong ánh xạ thì cộng vô lỗi
        //                if (!_primaryCol[i].AutoIncrement && !_primaryCol[i].ReadOnly && !_colsName.Contains(_primaryCol[i].ColumnName))
        //                    _error += ", " + _primaryCol[i].ColumnName;
        //                if (_colsName.Contains(_primaryCol[i].ColumnName))
        //                    where += "," + _primaryCol[i].ColumnName;
        //                //nếu là tự tăng hoặc chỉ đọc mà có trong danh sách chèn dữ liệu thì loại bỏ ra
        //                if ((_primaryCol[i].AutoIncrement || _primaryCol[i].ReadOnly) && _colsName.Contains(_primaryCol[i].ColumnName))
        //                {
        //                    _cols.RemoveAt(_colsName.IndexOf(_primaryCol[i].ColumnName));
        //                    _colsName.Remove(_primaryCol[i].ColumnName);
        //                }
        //                //else //ngược lại thì phát sinh điều kiện where cho khóa chính
        //                //    where += " AND " + _primaryCol[i].ColumnName + "=@" + _primaryCol[i].ColumnName;
        //            }
        //            if (_error != "")
        //                throw new Exception("Thiếu thông tin bắt buộc bắt buộc: " + _error.Substring(2) + " cho dữ liệu " + Tables[t]);
        //            //bỏ đi lệnh AND đầu của where
        //            if (where != "")
        //                where = where.Substring(1);
        //            //phát sinh lệnh update các cột đã bỏ đi khóa chính
        //            List<string> _primaryName = DataBaseController.ToListString(_primaryCol);
        //            foreach (string s in _colsName)
        //                if (!_primaryName.Contains(s))//nếu không là khóa chính
        //                    update += "," + s;
        //            //bỏ đi dấu , đầu tiên
        //            if (update != "")
        //                update = update.Substring(1);
        //            _TableUpdate.Add(Tables[t], update + "|" + where);
        //        }
        //        _TableInfo.Add(Tables[t], _cols);
        //    }
        //    string _lineError = "",
        //        _lineInserted = "";
        //    int _totalLineInserted = 0, _rowProcessed = 0, _rowUpdated = 0, _rowError = 0;
        //    SqlConnection _Connect = new SqlConnection(ConnectString);
        //    _Connect.Open();

        //    ImportType tmpType = type;
        //    foreach (string tb in _TableInfo.Keys)
        //    {
        //        type = tmpType;//lấy lại loại ban đầu (có thể thay đổi khi xử lý bảng trước)
        //        //phát sinh câu insert cho bảng
        //        List<DataColumn> _cols = _TableInfo[tb];
        //        //int _inserted = 0;
        //        string _colsInsert = _cols[0].ColumnName;
        //        string _paramsInsert = "@" + _cols[0].ColumnName;

        //        string _update = "";//chứa lệnh update
        //        string _select = "";//chứa lệnh select *
        //        string[] _whereCols = null, _updateCols = null;
        //        //----Tìm controller xử lý tương ứng---------
        //        IController _Control = FindController(tb);
        //        if (_Control == null)//nếu không có controller xử lý thì tự hàm xử lý
        //        {
        //            for (int c = 1; c < _cols.Count; c++)
        //            {
        //                _colsInsert += "," + _cols[c].ColumnName;
        //                _paramsInsert += ",@" + _cols[c].ColumnName;
        //            }
        //            if (type != ImportType.XoaDuLieuCu && _TableUpdate.ContainsKey(tb))
        //            {
        //                string[] _upwhere = _TableUpdate[tb].Split('|');
        //                _whereCols = _upwhere[1].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
        //                _updateCols = _upwhere[0].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

        //                string _where = "";
        //                if (_whereCols.Length > 0)
        //                {
        //                    _where = _whereCols[0] + "=@" + _whereCols[0];
        //                    for (int i = 1; i < _whereCols.Length; i++)
        //                        _where += " AND " + _whereCols[i] + "=@" + _whereCols[i];
        //                }
        //                if (_updateCols.Length > 0)
        //                {
        //                    _update = _updateCols[0] + "=@" + _updateCols[0];
        //                    for (int i = 1; i < _updateCols.Length; i++)
        //                        _update += "," + _updateCols[i] + "=@" + _updateCols[i];
        //                }
        //                if (_where != "" && _update != "")
        //                    _update = string.Format("update {0} set {1} where {2}", tb, _update, _where);
        //                else
        //                    _update = "";
        //                if (_where != "")
        //                    _select = string.Format("select count(*) from {0} where {1}", tb, _where);
        //            }
        //            //chuyển phần xóa từ trên xuống ...........
        //            else
        //            {
        //                try
        //                {
        //                    SqlCommand _delCmd = new SqlCommand("delete from " + tb, _Connect);
        //                    _delCmd.ExecuteNonQuery();
        //                }
        //                catch
        //                {
        //                    _lineError += string.Format("<br/>Không xóa được dữ liệu <b>{0}</b>, dữ liệu còn lại sẽ được cập nhật mới", tb);
        //                }
        //                type = ImportType.CapNhatDuLieuCu;
        //            }
        //        }
        //        else
        //            _Control.BeforeProcess(_Connect, type);
        //        string _insert = string.Format("insert into {0}({1}) values({2})", tb, _colsInsert, _paramsInsert);
        //        DataTable _data = new DataTable();
        //        List<string> _oldLine = new List<string>();
        //        //kiểm tra từng dòng trong dữ liệu
        //        for (int r = 0; r < Sheet.Rows.Count; r++)
        //        {
        //            DataRow row = Sheet.Rows[r];
        //            //thêm dòng dang xét vào dữ liệu
        //            SqlCommand _cmd = null;
        //            _rowProcessed++;
        //            string line = "";
        //            bool _success = false;
        //            bool _exist = false;
        //            if (_Control != null)
        //            {
        //                try
        //                {
        //                    int kkk = _Control.Process(row, _Maping, ParamValue, type, _Connect);
        //                    if (kkk == 1)
        //                        _totalLineInserted++;
        //                    else if (kkk == 2)
        //                        _rowUpdated++;
        //                    if (kkk > 0)
        //                        _success = true;
        //                }
        //                catch (Exception exx)
        //                {
        //                    _lineError += string.Format("<br/>Dữ liệu <b>{0}</b> dòng {2} lỗi: {1}", tb, exx.Message.Replace("'", "`").Replace("\r", "").Replace("\n", "<br/>"), (r + 2).ToString("#,#0"));
        //                    _rowError++;
        //                }
        //                continue;
        //            }


        //            _cmd = new SqlCommand(_insert, _Connect);
        //            line = AddParamValue(ref  _cmd, DataBaseController.ToListString(_cols).ToArray(),
        //                _Maping,//_excelCols, _sqlCols,
        //                ParamValue, row, tb);

        //            line = line.Trim(',');
        //            if (line == "" || _oldLine.Contains(line))
        //                continue;
        //            else
        //                _oldLine.Add(line);
        //            if (type != ImportType.XoaDuLieuCu && _select != "")//kiểm tra xem dữ liệu cũ có không
        //            {
        //                SqlCommand _cmdTest = new SqlCommand(_select, _Connect);

        //                AddParamValue(ref  _cmdTest, _whereCols,
        //                    _Maping,//_excelCols, _sqlCols, 
        //                    ParamValue, row, tb);
        //                try
        //                {
        //                    object o = _cmdTest.ExecuteScalar();
        //                    int v;
        //                    if (o != null && int.TryParse(o.ToString(), out v) && v > 0)
        //                        _exist = true;
        //                }
        //                catch (Exception exx)
        //                {
        //                    _exist = false;
        //                    _lineError += string.Format("<br/>Dữ liệu <b>{0}({1})</b> dòng {3} lỗi truy vấn thông tin: {2}", tb, line, exx.Message.Replace("'", "`").Replace("\r", "").Replace("\n", "<br/>"), (r + 2).ToString("#,#0"));
        //                }
        //            }
        //            if (_exist) //nếu đã có thì xử lý update hoac bỏ qua
        //            {
        //                if (type == ImportType.CapNhatDuLieuCu && _update != "")
        //                {
        //                    SqlCommand _cmdTest = new SqlCommand(_update, _Connect);
        //                    //thêm dữ liệu cập nhật
        //                    AddParamValue(ref  _cmdTest, _updateCols,
        //                        _Maping,//_excelCols, _sqlCols, 
        //                        ParamValue, row, tb);
        //                    //thêm dữ liệu điều kiện
        //                    AddParamValue(ref  _cmdTest, _whereCols,
        //                        _Maping,//_excelCols, _sqlCols, 
        //                        ParamValue, row, tb);
        //                    try
        //                    {
        //                        _cmdTest.ExecuteNonQuery();
        //                        _rowUpdated++;
        //                        _success = true;
        //                    }
        //                    catch (Exception exx)
        //                    {
        //                        _lineError += string.Format("<br/>Dữ liệu <b>{0}({1})</b> dòng {3} lỗi: {2}", tb, line, exx.Message.Replace("'", "`").Replace("\r", "").Replace("\n", "<br/>"), (r + 2).ToString("#,#0"));
        //                        _rowError++;
        //                    }
        //                }
        //            }
        //            else
        //            {
        //                try
        //                {
        //                    if (_cmd.ExecuteNonQuery() == 0)
        //                        throw new Exception("Không thêm được");
        //                    //_inserted++;
        //                    _totalLineInserted++;
        //                    _success = true;
        //                }
        //                catch (Exception exx)
        //                {
        //                    _lineError += string.Format("<br/>Dữ liệu <b>{0}({1})</b> dòng {3} lỗi: {2}", tb, line, exx.Message.Replace("'", "`").Replace("\r", "").Replace("\n", "<br/>"), (r + 2).ToString("#,#0"));
        //                    _rowError++;
        //                }
        //            }
        //        }
        //        //_lineInserted += string.Format("<br/>Đã thêm {0} dòng vào {1}", _inserted.ToString("#,#0"), tb);
        //    }
        //    _Connect.Close();
        //    //_lineInserted = string.Format("Đã xử lý {1} dòng. Có {0} dòng dữ liệu đã thêm mới và {2} dòng cập nhật. ", _totalLineInserted.ToString("#,#0"), _rowProcessed.ToString("#,#0"), _rowUpdated.ToString("#,#0"));
        //    if (_lineError != "")
        //        _lineError = string.Format("Có {0} dòng lỗi. Các thông tin lỗi: {1}", _rowError.ToString("#,#0"), _lineError);
        //    throw new InformationException(_lineError, _lineInserted);
        //}

    }
}
